#include using namespace std; const int N = 200050; long long ans[N]; int main() { int n, W = 0; scanf("%d", &n); vector one, two; for (int i = 0; i < n; i++) { int w, c; scanf("%d %d", &w, &c); if (w == 1) one.push_back(c); else two.push_back(c); W += w; } sort(one.begin(), one.end()); sort(two.begin(), two.end()); vector ONE = one, TWO = two; // construct even long long cur = 0; for (int w = 2; w <= W; w += 2) { int cost1 = 0, cost2 = 0; if (two.size() >= 1) { cost1 = two.back(); } int flag = 1; if (one.size() >= 2) { cost2 = one.back(); cost2 += one[one.size() - 2]; } else if (one.size() >= 1) { flag = 2; cost2 = one.back(); } if (cost1 > cost2) { cur += cost1; two.pop_back(); } else { cur += cost2; if (flag == 1) { one.pop_back(); one.pop_back(); } else { one.pop_back(); } } ans[w] = cur; } // construct odd one = ONE, two = TWO; cur = 0; if (one.size() >= 1) { cur = one.back(); one.pop_back(); } ans[1] = cur; for (int w = 3; w <= W; w += 2) { int cost1 = 0, cost2 = 0; if (two.size() >= 1) { cost1 = two.back(); } int flag = 1; if (one.size() >= 2) { cost2 = one.back(); cost2 += one[one.size() - 2]; } else if (one.size() >= 1) { flag = 2; cost2 = one.back(); } if (cost1 > cost2) { cur += cost1; two.pop_back(); } else { cur += cost2; if (flag == 1) { one.pop_back(); one.pop_back(); } else { one.pop_back(); } } ans[w] = cur; } for (int w = 1; w <= W; w++) { if (w > 1) printf(" "); printf("%lld", ans[w]); } printf("\n"); return 0; }